package edu.upc.e402grupo02.e402grupo02.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import edu.upc.e402grupo02.e402grupo02.dao.CarritoDAO;
import edu.upc.e402grupo02.e402grupo02.modelo.Carrito;
import edu.upc.e402grupo02.e402grupo02.modelo.Producto;
import edu.upc.e402grupo02.e402grupo02.modelo.UsuarioWeb;

public class CarritoDAOImpl implements CarritoDAO{

	protected JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public Carrito crearCarrito(UsuarioWeb usuario) {
		
		System.out.println("Crear Carrito para usuario: " + usuario.getLogin() );
		System.out.println("-------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("select max(id) from t_carrito");
		
		int maxId = 0;
		try{
			maxId = jdbcTemplate.queryForInt(sql.toString());
		}catch(EmptyResultDataAccessException e){
		}
		
		maxId++;
		
		sql =  new StringBuffer();
		sql.append("insert into t_carrito ");
		sql.append("(id, usuario_web, fecha, estado) ");
		sql.append("values (?, ?, sysdate(), '1')");
		
		Object[] params = new Object[]{ maxId, usuario.getLogin()  };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se grabo el carrito en modo temporal con el codigo : " + maxId);
		else
			System.out.println("No Se grabo el carrito!!!");
		System.out.println();
		
		return findCarritoById(maxId);

	}

	public void agregarProducto(Producto producto, Carrito carrito, int cantidad) {
		System.out.println("Agregar el producto " + producto.getId() + " al carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("insert into t_carrito_producto ");
		sql.append("(id_carrito, id_producto, cantidad, precio, total) ");
		sql.append("values (?, ?, ?, ? , ?)");
		
		Object[] params = new Object[]{ carrito.getId(), producto.getId(), cantidad, producto.getPrecio(), producto.getPrecio()*cantidad  };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se grabo el producto en el carrito");
		else
			System.out.println("No Se grabo el producto en el carrito!!!");
		System.out.println();
	}

	public void quitarProducto(Producto producto, Carrito carrito) {
		System.out.println("Quitar el producto " + producto.getId() + " del carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("delete from t_carrito_producto ");
		sql.append("where id_carrito=? and id_producto=? ");
		
		Object[] params = new Object[]{ carrito.getId(), producto.getId()  };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se elimino el producto en el carrito");
		else
			System.out.println("No Se elimino el producto en el carrito!!!");
		System.out.println();
		
	}

	public void grabarCarrito(Carrito carrito) {
		System.out.println("Grabar el carrito : " + carrito.getId());
		System.out.println("------------------------------------------------------------");
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_carrito ");
		sql.append("set estado = '2' ");
		sql.append("where id=? ");
		
		Object[] params = new Object[]{ carrito.getId() };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		if(result>0)
			System.out.println("Se finalizo el carrito.");
		else
			System.out.println("No Se finalizo el carrito!!!");
		System.out.println();
	}

	public Carrito findCarritoById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, fecha, estado ");
		sql.append("from T_carrito c ");
		sql.append("inner join t_usuario_web u on u.login = c.usuario_web ");
		sql.append("where id=?");
		
		Object[] params = new Object[]{ id };
		
		try{
			return jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper<Carrito>(){

				public Carrito mapRow(ResultSet rs, int arg1) throws SQLException {
					
					UsuarioWeb usuario = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
					Carrito carrito = new Carrito();
					carrito.setId(rs.getInt(1));
					carrito.setUsuarioWeb(usuario);
					carrito.setFecha(rs.getDate(5));
					carrito.setEstado(rs.getString(6));
					return carrito;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

	public Producto findProductoById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, nombre, descripcion, precio ");
		sql.append("from T_producto ");
		sql.append("where id=?");
		
		Object[] params = new Object[]{ id };
		
		try{
			return jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper<Producto>(){

				public Producto mapRow(ResultSet rs, int arg1) throws SQLException {
					
					Producto producto = new Producto();
					producto.setId(rs.getInt(1));
					producto.setNombre(rs.getString(2));
					producto.setDescripcion(rs.getString(3));
					producto.setPrecio(rs.getDouble(4));
					return producto;
					
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

}
